# bash completion for xm                                   -*- shell-script -*-

# Use of this file is deprecated.  The 'xm' command itself is no longer
# provided by upstream.  It has been replaced with the 'xl' command, for
# which upstream provides completion, use that instead.

_xen_domain_names()
{
    COMPREPLY=($(compgen -W "$(xm list 2>/dev/null |
        awk '!/Name|Domain-0/ { print $1 }')" -- "$cur"))
}

_xen_domain_ids()
{
    COMPREPLY=($(compgen -W "$(xm list 2>/dev/null |
        awk '!/Name|Domain-0/ { print $2 }')" -- "$cur"))
}

_xm()
{
    local cur prev words cword
    _init_completion || return

    # TODO: _split_longopt

    local args command commands options

    commands='console vncviewer create new delete destroy domid domname
        dump-core list mem-max mem-set migrate pause reboot rename reset
        restore resume save shutdown start suspend sysrq trigger top unpause
        uptime usb-add usb-del vcpu-list vcpu-pin vcpu-set debug-keys dmesg
        info log serve sched-credit sched-sedf block-attach block-detach
        block-list block-configure network-attach network-detach network-list
        vtpm-list pci-attach pci-detach pci-list pci-list-assignable-devices
        scsi-attach scsi-detach scsi-list vnet-list vnet-create vnet-delete
        labels addlabel rmlabel getlabel dry-run resources dumppolicy setpolicy
        resetpolicy getpolicy shell help'

    if ((cword == 1)); then
        COMPREPLY=($(compgen -W "$commands" -- "$cur"))
    else
        if [[ $cur == *=* ]]; then
            prev=${cur/=*/}
            cur=${cur/*=/}
        fi

        command=${words[1]}
        if [[ $cur == -* ]]; then
            # possible options for the command
            case $command in
                create)
                    options='-c'
                    ;;
                dmesg)
                    options='--clear'
                    ;;
                list)
                    options='--long'
                    ;;
                reboot)
                    options='-w -a'
                    ;;
                shutdown)
                    options='-w -a -R -H'
                    ;;
                sched-credit)
                    options='-d -w -c'
                    ;;
                block-list | network-list | vtpm-list | vnet-list)
                    options='-l --long'
                    ;;
                getpolicy)
                    options='--dumpxml'
                    ;;
                new)
                    options='-h --help --help_config -q --quiet --path= -f=
                        --defconfig= -F= --config= -b --dryrun -x --xmldryrun
                        -s --skipdtd -p --paused -c --console_autoconnect'
                    ;;
            esac
            COMPREPLY=($(compgen -W "$options" -- "$cur"))
        else
            case $command in
                console | destroy | domname | domid | list | mem-set | \
                    mem-max | pause | reboot | rename | shutdown | unpause | \
                    vcpu-list | vcpu-pin | vcpu-set | block-list | \
                    network-list | vtpm-list)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                    esac
                    ;;
                migrate)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            _known_hosts_real -- "$cur"
                            ;;
                    esac
                    ;;
                restore | dry-run | vnet-create)
                    _filedir
                    ;;
                save)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            _filedir
                            ;;
                    esac
                    ;;
                sysrq)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=($(compgen -W "r s e i u b" -- "$cur"))
                            ;;
                    esac
                    ;;
                block-attach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=($(compgen -W "phy: file:" -- "$cur"))
                            ;;
                        5)
                            COMPREPLY=($(compgen -W "w r" -- "$cur"))
                            ;;
                        6)
                            _xen_domain_names
                            ;;
                    esac
                    ;;
                block-detach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=($(compgen -W "$(xm block-list $prev \
                                2>/dev/null | awk '!/Vdev/ { print $1 }')" \
                                -- "$cur"))
                            ;;
                    esac
                    ;;
                network-attach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        *)
                            COMPREPLY=($(compgen -W "script= ip= mac= bridge=
                                backend=" -- "$cur"))
                            ;;
                    esac
                    ;;
                network-detach)
                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                        3)
                            COMPREPLY=($(compgen -W "$(xm network-list $prev \
                                2>/dev/null | awk '!/Idx/ { print $1 }')" \
                                -- "$cur"))
                            ;;
                    esac
                    ;;
                sched-credit)
                    case $prev in
                        -d)
                            _xen_domain_names
                            return
                            ;;
                    esac
                    ;;
                create)
                    _filedir
                    COMPREPLY+=(
                        $(compgen -W '$(command ls /etc/xen 2>/dev/null)' \
                            -- "$cur"))
                    ;;
                new)
                    case $prev in
                        -f | -F | --defconfig | --config)
                            _filedir
                            return
                            ;;
                        --path)
                            _filedir -d
                            return
                            ;;
                    esac

                    _count_args
                    case $args in
                        2)
                            _xen_domain_names
                            ;;
                    esac
                    ;;
            esac
        fi
    fi
} &&
    complete -F _xm xm

# ex: filetype=sh
